/**
 * @file ./src/sql/mssql/index.js
 * @description 该文件提供了一系列用于MSSQL数据库的包装函数。
 * 包括列表查询、分页查询、更新、插入功能。
 * @author zouanzu
 */
const mssql = require("mssql");
const config = require('../config');
const databaseConfig = config.dbconfig.mssql;

// 推断 SQL 参数类型
const sqltype = (val) => {
    if (typeof val === 'number') {
        return mssql.Int;
    } else if (typeof val === 'string') {
        return mssql.VarChar(val.length);
    } else if (val instanceof Date) {
        return mssql.DateTime;
    } else {
        return mssql.VarChar(255); // 默认类型
    }
};

// 监听 MSSQL 错误事件
mssql.on('error', err => {
    console.error("MSSQL 异常原因：" + err.message);
});

// 获取列表数据
const getList = async (sql, params) => {
    const pool = new mssql.ConnectionPool(databaseConfig);
    try {
        await pool.connect(); // 连接数据库
        const request = pool.request();

        // 绑定参数
        for (const key in params) {
            request.input(key, sqltype(params[key]), params[key]);
        }

        // 执行查询
        const result = await request.query(sql);
        return {
            code: 1,
            msg: 'success',
            data: {
                recordset: result.recordset,
                total: result.recordset.length
            },
            affectedRows: result.rowsAffected
        };
    } catch (err) {
        console.error('查询失败:', err);
        return {
            code: 0,
            msg: 'fail',
            data: err.message
        };
    } finally {
        await pool.close(); // 关闭连接池
    }
};

// 执行 SQL 语句（插入或更新）
const exec = async (sql, params) => {
    const result = await getList(sql, params);
    if (result.data.recordset.length > 0) {
        result.action = 'insert';
        result.insertId = result.data.recordset[0]['id'];
    } else {
        result.action = 'update';
    }
    return result;
};

// 获取分页列表数据
const getPageList = async (sqls) => {
    const result = await getList(sqls.sql2, sqls.args2);
    if (result.data.recordset.length > 0) {
        result.data.total = result.data.recordset[0]['TotalCount'];
    } else {
        result.data.total = 0;
    }
    return result;
};

module.exports = {
    getList,
    getPageList,
    exec
};